#include "Config.h"

/*
 * 后端设置层
 */

Config::Config(QObject* parent) : QObject(parent)
{
    stateManager = std::make_unique<StateManager>("config.ini");
    serialMgr = std::make_unique<SerialMgr>();
    udpClient = std::make_unique<UdpClient>();
    tcpClient = std::make_unique<TcpClient>();
    tcpserverClient = std::make_unique<TcpserverClient>();
}

Config::~Config()
{
}

/*
 * 模式选择
 */
void Config::setConnectionModes(const QString& Str)
{
    ConnectionModes = Str;
    stateManager->saveValue("ConnectionModes",ConnectionModes);
    qDebug() << "模式选择" << Str;
}

/*
 * 通用的数据保存
 * @param Name 键名
 * @param value 要保存的值，可以是 int、QString、bool 等类型
 */
void Config::setValue(const QString &Name, const QVariant &value)
{
    stateManager->saveValue(Name, value);
}


/*
 * 通用的字符串读取
 * @param Name 键名
 * @param defaultValue 默认值
 * @return 读取到的字符串
 */
QString Config::getStringValue(const QString &Name, const QString &defaultValue)
{
    return stateManager->loadValue(Name, defaultValue).toString();
}

/*
 * 通用的整数读取
 * @param Name 键名
 * @param defaultValue 默认值
 * @return 读取到的整数
 */
int Config::getIntValue(const QString &Name, int defaultValue)
{
    return stateManager->loadValue(Name, defaultValue).toInt();
}

/*
 * 设置按钮状态
 */
void Config::setConnectionOpened(bool opened)
{
    emit connectionOpenedChanged(opened); // 触发信号
    qDebug() << "按钮状态为:" << opened;
}

/*
 * 读取工作模式
 */
QString Config::readConnectionModes()
{
    return ConnectionModes;
}

/*
 * 设置编码器格式
 */
void Config::setEncodedMode(const QString& Str)
{
    EncodedMode = Str;
    stateManager->saveValue("Encoding",EncodedMode);
}

/*
 * 读取编码器格式
 */
QString Config::ReadEncodedMode()
{
    return EncodedMode;
}


/*
 * 设置端口名字
 */
void Config::setPortName(const QString& Str)
{
    serialMgr->PortName = Str;
    stateManager->saveValue("PortName",serialMgr->PortName);
    emit portChanged();
    // qDebug() << "后端端口" << Str;
}

/*
 * 设置波特率
 */
void Config::setBaudRate(const QString& Str)
{
    serialMgr->BaudRate = Str;
    stateManager->saveValue("BaudRate",serialMgr->BaudRate);
    // qDebug() << "后端波特率" << Str;
}

/*
 * 设置数据位
 */
void Config::setDataBits(const QString& Str)
{
    serialMgr->DataBits = Str;
    stateManager->saveValue("DataBits",serialMgr->DataBits);
    // qDebug() << "后端数据位" << Str;
}

/*
 * 设置数据流
 */
void Config::setControl(const QString& Str)
{
    serialMgr->Control = Str;
    stateManager->saveValue("Control",serialMgr->Control);
    // qDebug() << "后端数据流" << Str;
}

/*
 * 设置停止位
 */
void Config::setStopBits(const QString& Str)
{
    serialMgr->StopBits = Str;
    stateManager->saveValue("StopBits",serialMgr->StopBits);
    // qDebug() << "后端停止位" << Str;
}

/*
 * 设置校验位
 */
void Config::setParity(const QString& Str)
{
    serialMgr->Parity = Str;
    stateManager->saveValue("Parity",serialMgr->Parity);
    // qDebug() << "后端校验位" << Str;
}

/*
 * HEX字符串转换
 */
QString Config::setHexData(const QString& Str)
{
    QString hexData = Str;
}

/*
 * 读取端口号
 */
QString Config::ReadPortName()
{
    return serialMgr->PortName;
}

/*
 * 读取波特率
 */
QString Config::ReadBaudRate()
{
    return serialMgr->BaudRate;
}

/*
 * 读取数据位
 */
QString Config::ReadDataBits()
{
    return serialMgr->DataBits;
}

/*
 * 读取数据流
 */
QString Config::ReadControl()
{
    return serialMgr->Control;
}

/*
 * 读取停止位
 */
QString Config::ReadStopBits()
{
    return serialMgr->StopBits;
}

/*
 * 读取校验位
 */
QString Config::ReadParity()
{
    return serialMgr->Parity;
}


/*
 * @brief 设置串口错误状态并发射信号
 * @param errorMsg 错误描述
 *
 * 功能：
 * 1. 将错误信息通过信号发送给 QML 或其他槽函数
 * 2. UI 可以根据 errorMsg 显示提示，例如被占用或设备丢失
 */
void Config::setSerialError(const QString& errorMsg)
{
    if (!errorMsg.isEmpty())
    {
        emit serialErrorOccurred(errorMsg); // 发射错误信号
        qDebug() << "串口错误:" << errorMsg;
    }
}

/*
 * @brief 扫描串口列表并更新可用列表
 *
 * 功能：
 * 1. 扫描当前可用的串口列表
 * 2. 发送信号 comListChanged，通知 QML 刷新可用列表
 */
void Config::updateComList(QStringList scanSerialPorts, bool isOpen)
{
    if (!isOpen)
    {
        // 如果串口没打开才扫描
        if (scanSerialPorts != serialMgr->lastPorts_)   // 串口有变化
        {
            serialMgr->lastPorts_ = scanSerialPorts;    // 更新缓存
            emit comListChanged(scanSerialPorts);  // 通知 QML 更新
        }
    }
}

/*
 * @brief 判断已打开的串口是否丢失
 * @param currentPorts 当前可用端口列表
 * 功能：
 * 1. 检查当前保存的端口是否还存在
 * 2. 如果丢失，则发出信号通知 UI 层
 */
void Config::isPortLost(const QStringList& currentPorts, SERIAL* Serial)
{
    // 如果没有保存任何端口（说明还没打开过），直接返回
    if (serialMgr->PortName.isEmpty())
        return;

    // 如果串口本身没有打开，也直接返回
    if (!Serial->isOpen())  // 假设 SERIAL 有 IsOpen() 判断
        return;

    // 如果当前端口不在可用列表中 → 说明被拔掉或丢失
    if (!currentPorts.contains(serialMgr->PortName))
    {
        qWarning() << "串口丢失:" << serialMgr->PortName;

        // 清空当前端口记录
        serialMgr->PortName.clear();

        //关闭串口
        Serial->SetSerialClose();
        setConnectionOpened(false);

        // 发出信号给 QML 层，让 UI 更新或提示用户
        emit serialPortLost();
    }

}


void Config::setRangeIP(const QString& Str)
{

}

void Config::setRangePort(const QString& Str)
{
}

void Config::setLocalPort(const QString& Str)
{
}

QString Config::ReadRangeIP()
{
    return udpClient->RangeIP;
}

QString Config::ReadRangePort()
{
    return udpClient->RangePort;
}

QString Config::ReadLocalPort()
{
    return udpClient->LocalPort;
}






